package com.li.sqlparse;

import com.li.sqlparse.entity.ParseItemDto;
import com.li.sqlparse.entity.SetDeclareItemDto;
import com.li.sqlparse.entity.TableColumnLinkDto;
import com.li.sqlparse.factory.SqlParseFactory;
import com.li.sqlparse.service.SqlParseHelperService;
import com.li.sqlparse.service.SqlParseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

/**
 * @author LiDong
 */
public class SqlParseTest {

    private static final Logger logger = LoggerFactory.getLogger(SqlParseTest.class);

    /**
     * 解析 触发器 sql
     *
     * @param sql
     * @param dbType
     */
    private void dealTriggerSqlDependencies(String sql, String dbType) {
        SqlParseService sqlParseService = SqlParseFactory.getInstance().getSqlParseService(dbType);
        SqlParseHelperService sqlParseHelperService = SqlParseFactory.getInstance().getSqlParseHelperService();
        // 校验是不是触发器Sql
        if (sqlParseHelperService.checkTriggerSql(sql, dbType)) {
            return;
        }
        try {
            // sql中Set语句相关的解析对象
            Set<TableColumnLinkDto> links = new HashSet<>();
            // sql中Set语句相关的Column
            Set<String> setSelectColumns = new LinkedHashSet<>();
            // Sql语句中Set语句相关的table
            Set<String> setFromTables = new LinkedHashSet<>();
            // 解析触发器自定义的解析对象
            List<ParseItemDto> parseItems = new ArrayList<>();
            // Set Declare 语句解析对象
            List<SetDeclareItemDto> setDeclareItemDtos = new ArrayList<>();
            sqlParseHelperService.dealSqlParse(sql, dbType, setSelectColumns, setFromTables, setDeclareItemDtos, parseItems, sqlParseService);
            if (parseItems.isEmpty()) {
                logger.info("触发器Sql解析对象为空，触发器Sql解析结束!");
                return;
            }
            logger.info("触发器Sql共解析parseItems：" + parseItems.size());
            sqlParseService.dealTriggerDependencies(setDeclareItemDtos, parseItems, links);
            logger.info("触发器Sql共解析到Sql中关系：" + links.size());
        } catch (Exception e) {
            logger.error("Error Occur:{}", e.getMessage());
        }
    }


}